package org.upo.eps.it.phama.dao;

import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.upo.eps.it.phama.bean.Almacen;
import org.upo.eps.it.phama.util.HibernateUtil;

/**
 *
 * @author grupo 4
 */
public class AlmacenDAO {
    /**
     * Devuelve un objeto de la clase Almacen cuyos atributo idAlmacen
     * corresponda con el aportado como parámetro. Como el atributo almacen es
     * único, el método sólo puede devolver un objeto o nulo, si no se
     * encontrara.
     *
     * @param idAlmacen Integer con el identificador del almacen.
     * @return Objeto de la clase Almacen o nulo.
     */
    public static Almacen getById(int idAlmacen) {
        Almacen result;
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        String sql = String.format("from Almacen where idAlmacen = %d", idAlmacen);
        Query qry = session.createQuery(sql);
        result = (Almacen) qry.uniqueResult();
        session.close();

        return result;
    }
    /**
     * Obtiene una lista con todos los almacenes existentes en la base de datos.
     *
     * @return Lista de objetos de la clase Almacen.
     */
    public static List<Almacen> getAlmacenes() {
        List<Almacen> almacenes;
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        String sql = "from Almacen";
        Query qry = session.createQuery(sql);
        almacenes = (List<Almacen>) qry.list();
        session.close();

        return almacenes;
    }

    /**
     * Efectúa la búsqueda de todos aquéllos almacenes cuyos atributos
     * correspondan con todos los parámetros recibidos. Si no se aporta algún
     * parámetro, el mismo será sustituido por el comodín que implica a todos.
     * Como la cadena de búsqueda se construye a base de comparadores
     * <code>like</code>, los parámetros pueden contender el comodín
     * <code>%</code>.
     *
     * @param nombre String con el nombre del almacen que se busca.
     * @param poblacion String con el nombre de la poblacion del almacen que se busca.
     * @param provincia String con el nombre de la provincia del almacen que se busca.
     * @return Lista de objetos de la clase Almacen que cumplen con los
     * parámetros aportados.
     */
    public static List<Almacen> search(String nombre, String poblacion, String provincia) {
        List<Almacen> resultado;
        /* Si algún parámetro no tuviera contenido, se sustituye por el comodín %, que indica que se ese campo NO se tendrá
         * en cuenta en la búsqueda.
         */
        String n = nombre.trim().isEmpty() ? "%" : nombre.trim();
        String po = poblacion.trim().isEmpty() ? "%" : poblacion.trim();
        String pr = provincia.trim().isEmpty() ? "%" : provincia.trim();
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        
        /* Finalmente, se construye la cadena sql a base de comparadores like y se ejecuta
         * la consulta.
         */
        String sql = String.format("from Almacen where nombre like '%s' and direccion.poblacion like '%s' and direccion.provincia like '%s'", n, po, pr);
        Query qry = session.createQuery(sql);
        resultado = (List<Almacen>) qry.list();
        session.close();

        return resultado;
    }

    /**
     * Se hace persistente el almacen recibido como parámetro.
     *
     * @param almacen Objeto de la clase Almacen.
     * @throws HibernateException
     */
    public static void save(Almacen almacen) throws HibernateException {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        try {
            // Se guarda el almacen en la base de datos.
            session.saveOrUpdate(almacen.getDireccion());
            session.saveOrUpdate(almacen);
            session.getTransaction().commit();
        } catch (HibernateException ex) {
            session.getTransaction().rollback();
            throw ex;
        }
    }

    /**
     * Se elimina de la base de datos el almacen cuyo id se recibe como
     * parámetro.
     *
     * @param id Integer con el id del almacen que se quiere eliminar.
     * @throws HibernateException
     */
    public static void delete(int id) throws HibernateException {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        try {
            Query qry = session.createQuery(String.format("delete Almacen where idAlmacen = %d", id));
            qry.executeUpdate();
            session.getTransaction().commit();
        } catch (HibernateException ex) {
            session.getTransaction().rollback();
            throw ex;
        }
    }
}
